package com.rede.didiok.common.config.feign;

import javax.servlet.http.HttpServletRequest;

import feign.RequestInterceptor;
import feign.RequestTemplate;

import com.rede.didiok.common.constant.conf.base.BaseSysConf;
import com.rede.didiok.common.constant.global.Constants;
import com.rede.didiok.common.holder.RequestHolder;
import com.rede.didiok.common.utils.StringUtils;


/**
 * Feign请求拦截器【设置请求头，传递登录信息】
 *
 */
public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {

        // 获取Http请求
        HttpServletRequest request = RequestHolder.getRequest();

/*
        // 1、使用 RequestContextHolder 拿到请求数据，RequestContextHolder底层使用过线程共享数据 ThreadLocal<RequestAttributes>
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes!=null){
            HttpServletRequest request = attributes.getRequest();
            // 2、同步请求头数据，Cookie
            String cookie = request.getHeader("Cookie");
            // 给新请求同步了老请求的cookie
            requestTemplate.header("Cookie",cookie);
        }
        */
//
//        // 在做接口请求时，我们经常会在header头中增加一些鉴权信息，如token 或 jwt，那么在通过fegin从A server去调用B server的接口时，如果B server的接口需要header信息，我们需要将A sever获取的header转发到B上。
//        Enumeration<String> headerNames = request.getHeaderNames();
//        if (headerNames != null) {
//            while (headerNames.hasMoreElements()) {
//                String name = headerNames.nextElement();
//                String values = request.getHeader(name);
//                requestTemplate.header(name, values);
//
//            }
//        }
        // 获取token，放入到feign的请求头
        String token = null;
        if (request != null) {
            if (request.getParameter(BaseSysConf.TOKEN) != null) {
                token = request.getParameter(BaseSysConf.TOKEN);
            } else if (request.getAttribute(BaseSysConf.TOKEN) != null) {
                token = request.getAttribute(BaseSysConf.TOKEN).toString();
            }
        }

        if (StringUtils.isNotEmpty(token)) {
            // 如果带有？说明还带有其它参数，我们只截取到token即可
            if (token.indexOf(Constants.SYMBOL_QUESTION) != -1) {
                String[] params = token.split("\\?url=");
                token = params[0];
            }
            requestTemplate.header(BaseSysConf.SERVICE_TOKEN, token);
        }

        // 设置自定义的请求头，用来标识是内部feign请求
        // 需要在网关进行该请求头擦拭，防止非法设置
        requestTemplate.header(BaseSysConf.FEIGN_REQUEST, BaseSysConf.FEIGN_REQUEST);

    }
}
